package com.usian.user.service.impl;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.usian.common.admin.AdminConstans;
import com.usian.model.article.pojos.ApAuthor;
import com.usian.model.base.BaseServiceImpl;
import com.usian.model.common.dtos.ResponseResult;
import com.usian.model.media.pojos.WmUser;
import com.usian.model.user.dtos.AuthDto;
import com.usian.model.user.pojos.ApUser;
import com.usian.model.user.pojos.ApUserRealname;
import com.usian.user.mapper.ApUserMapper;
import com.usian.user.feign.ArticleFeign;
import com.usian.user.feign.WemediaFeign;
import com.usian.user.mapper.ApUserRealnameMapper;
import com.usian.user.service.ApUserRealnameService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.LinkedHashMap;

@Service
public class ApUserRealnameServiceImpl extends BaseServiceImpl<ApUserRealnameMapper, ApUserRealname> implements ApUserRealnameService {

    @Autowired
    private ArticleFeign articleFeign; //作者

    @Autowired
    private WemediaFeign wemediaFeign; //自媒体

    @Autowired
    private ApUserMapper  userMapper;  //用户



    @Override
    public ResponseResult loadListByStatus(AuthDto dto) {
        //为空，返回错误
        if(dto == null) return errorParam;


        //根据status查询返回
        return  getPageData(dto,Wrappers.<ApUserRealname>lambdaQuery().eq(dto.getStatus()!=null
                ,ApUserRealname::getStatus,dto.getStatus()));
    }


    //4表操作：
    // 认证表、自媒体表、作者表、用户表
    //   认证表、用户表、更新状态    自媒体表、作者表 插入数据
    @Override
    public ResponseResult updateStatusById(AuthDto dto, Short status) {
        //0 用户没输入就报错
        if(dto == null || dto.getId() ==null) return errorParam;

        //1.通过id=5的json字符串,查出当前id为5的认证列表信息
        ApUserRealname attestation = getById(dto.getId());

        //2.通过当前认证列表的userid：5, 查出c端用户信息
        ApUser user_c = userMapper.selectById(attestation.getUserId());

        //3.创建一个认证对象,修改状态为审核通过
        ApUserRealname realname = new ApUserRealname();
        realname.setStatus(status);
        realname.setId(dto.getId());

        //4.用户拒绝原因为空，就把当前认证列表的对象拒绝原因设置给用户
        if(StringUtils.isEmpty(dto.getMsg())) realname.setReason(dto.getMsg());

        //5.更新到数据库 当前c端id为5 认证表（第一张表）
        updateById(realname);

        //6.审核状态值=9
        if(status == AdminConstans.PASS_AUTH){
            //7.通过c端用户名称，获取当前自媒体人对象
            WmUser wmUser  = wemediaFeign.findByName(user_c.getName());

            //8.当前自媒体对象为空
            if(wmUser == null){
                //9.创建一个自媒体对象
                wmUser = new WmUser();
                //10.把c端用户id：5 设置给自媒体对象
                wmUser.setApUserId(user_c.getId());
                //11.把c端对象信息,拷贝给自媒体对象
                BeanUtils.copyProperties(user_c,wmUser);
                //12.设置当前时间给自媒体对象
                wmUser.setCreatedTime(new Date());

                //13.设置自媒体对象状态为正常可用
                wmUser.setStatus(9);
                //14.
                //步骤1.插入数据库，当前用户输入的id为5 自媒体表（第二张表）
                ResponseResult save = wemediaFeign.save(wmUser);
                //步骤2.取出插入的数据,重新给id赋值,因为下面的作者对象,需要当前你插入的自媒体主键id
                LinkedHashMap map  = (LinkedHashMap) save.getData();
                //步骤3.取出id，设置给当前自媒体对象
                wmUser.setId((Integer) map.get("id"));

            }

            //15.通过c端用户id：5，获取当前作者对象
            ApAuthor author = articleFeign.findByUserId(user_c.getId());

            //16.当前作者对象为空
            if(author == null){
                //17.创建一个作者对象
                author = new ApAuthor();
                //18.把c端用户名称 设置给作者对象
                author.setName(user_c.getName());
                //19.把c端用户id：5 设置给作者对象
                author.setUserId(user_c.getId());
                //20.设置当前时间给作者对象
                author.setCreatedTime(new Date());
                //21.把自媒体用户id设置给作者对象
                author.setWmUserId(wmUser.getId());
                //22.修改作者状态为平台自媒体人
                author.setType(2);
                System.out.println("author"+author.toString());
                //23.
                //步骤1.插入数据库，当前c端id为5 自媒体id为当前自媒体表插入的id  作者表 （第三张表）
                ResponseResult result = articleFeign.save(author);
                //步骤2.取出插入的数据,获取id,因为自媒体表,需要当前你插入的作者id
                LinkedHashMap map  = (LinkedHashMap) result.getData();
                //步骤3.取出id，设置给当前自媒体对象
                wmUser.setApAuthorId((Integer) map.get("id"));
                //步骤4.更新数据库,完成更新操作
                wemediaFeign.updateAuthorid(wmUser);
            }


            //24.创建一个用户对象
            ApUser tempUser = new ApUser();
            //25.把当前c端id：5 给用户对象
            tempUser.setId(user_c.getId());
            //26.设置状态为自媒体人状态
            tempUser.setFlag((short) 1);
            //27.更新到数据库 当前c端id 为5 用户表（第四张表）
            userMapper.updateById(tempUser);
            // //测试steta分布式事务
            // int i = 1/0;
        }

        return success;
    }
}